package cn.zerlynn.sql.dialect.util;

import java.util.Optional;

/**
 * Utility class for SQL-related helper functions.
 *
 * @author: zerlynn
 * @createTime: 2024/10/24 0:08
 */
public class SQLUtils {


    /**
     * 判断给定的字符串是否由数字组成
     *
     * @param str 待检查的字符串
     * @return 如果字符串不为空且全部由数字组成，则返回true；否则返回false
     */
    public static boolean isNumeric(String str) {
        return str != null && str.matches("\\d+");
    }

    /**
     * 转义SQL标识符。
     * <p>
     * 该方法主要用于转义SQL标识符中的特殊字符，以防止SQL注入并确保SQL语句的正确解析。
     * 例如，当标识符包含双引号字符 (") 时，它将被转义为两个双引号 ("")。
     * 标识符然后被包裹在双引号中，以确保其在SQL语句中的安全使用。
     *
     * @param identifier 需要转义的SQL标识符，如表名、列名等。
     * @return 转义后的SQL标识符字符串。
     */
    public static String escapeIdentifier(String identifier) {
        return "\"" + identifier.replace("\"", "\"\"") + "\"";
    }

    /**
     * 将给定的名称与模式字符串结合，如果模式非空则返回模式.名称的格式，否则仅返回名称
     * 此方法的目的是在存在模式时，将名称包装在模式之下，以满足某些系统或数据库的命名要求
     *
     * @param schema 可能为空的模式字符串，代表一个命名空间或架构
     * @param name 要与模式结合的名称字符串，不应为空
     * @return 如果模式为空，则返回原始名称；否则返回模式和名称用点（.）连接的字符串
     */
    public static String wrapWithSchema(String schema, String name) {
        return Optional.ofNullable(schema)
                .filter(s -> !s.isEmpty())
                .map(s -> s + "." + name)
                .orElse(name);
    }

    /**
     * 检查字符串是否为空或仅包含空格
     * <p>
     * 此方法用于判断给定的字符串是否为null，或者在去除所有空格后是否为空字符串
     * 它提供了一种统一的方式来检测空字符串或只包含空格的字符串
     *
     * @param str 待检查的字符串
     * @return 如果字符串为null或trim后的字符串为空，则返回true；否则返回false
     */
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
}
